(* ===================================================================== *)
(** INPUTMAKER : module integrant construction de l'objet de lecture 
    sequentielle à partir de stdin.
    @author Mathieu Barbin
    @version 1.0.*  *)
(* ===================================================================== *)

(* ==================== *)
(*     Dependances      *)
(* ==================== *)
open ListMap
open Inputtools
(* open Message *)
(* ==================== *)

(* ===================================================================== *)
(** Fonction de creation d'un objet de type lecture sequentielle.
    @param tab_name un tableau indiquant les types des entrees ainsi
    que leur nom
    @return lecture un objet de lecture sequentielle *)
(* ===================================================================== *)
class get_input (nom_entrees_in : string array) =
  let len = Array.length nom_entrees_in in
object
  val nb = len 
  val nom_entrees = Array.copy nom_entrees_in
  val mutable index_cycle = 0

  method get_nom_entrees = nom_entrees
  method get_index_cycle = index_cycle
  method init = ()
  method quit = ()

  (* methode qui permet d'envoyer les entrees au circuit *)
  (* doit envoyer un message d'erreur si l'arite de l'entree
     sur stdin n'est pas suffisante *)

  method lecture tab_entrees =
    if nb = 0 
    then ()
    else
      let tab_len = Array.length tab_entrees in
      begin
	let string_in = Bplib.safe_input_line stdin in
	let stlen = String.length string_in in
	if (stlen < tab_len) || (tab_len <> nb)
	then
	  begin
	    Message.message#input_arite_error string_in stlen tab_len; 
	    failwith "w-friendly"
	  end
	else
	  for i = 0 to pred tab_len do
	    Array.unsafe_set tab_entrees i (string_in.[i] = '1')
	  done;
	if index_cycle = max_int
	then index_cycle <- 0
	else index_cycle <- succ index_cycle 
      end
end
(* ===================================================================== *)
